package Algorithm;

import sun.security.x509.IssuerAlternativeNameExtension;

/**
 * @author gthang
 * @description: 单例模式-饿汉式
 */
public class Singleton {
//
//    private static Singleton instance = new Singleton();
//
//    private Singleton(){}
//
//    public static Singleton getInstance(){
//        return instance;
//    }


    /**
     * 单例模式-懒汉式
     */
//        private static Singleton instance;
//
//        private Singleton(){}
//
//        public static Algorithm.Singleton getInstance(){
//            if (instance == null){
//                instance = new Singleton();
//            }
//            return instance;
//        }



//        双检索单例模式

//    private static volatile Singleton instance = null;
//
//    private Singleton(){}
//
//    public static Singleton getInstance(){
//        if (instance == null){
//
//            synchronized (Singleton.class){
//                if (instance == null){
//                    instance = new Singleton();
//                }
//            }
//
//        }
//        return instance;
//    }
    /**
     * 静态内部类
     */
//    private Singleton(){}
//
//    private static class SingletonFactory{
//        private static Singleton instance = new Singleton();
//    }
//
//    /**
//     * 获取实例
//     */
//
//    public static Singleton getInstance(){
//        return SingletonFactory.instance;
//    }
//
//    /**
//     * 如果该对象被用于序列化，可以保证对象序列化前后保持一致
//     * @return
//     */
//    public Object readResolve(){
//        return getInstance();
//    }

    /**
     * 枚举类
     */
//    public enum Singleton{
//        Instance;
//    }


//    private static Singleton instance = new Singleton();
//    private Singleton(){}
//    public static Singleton getInstance(){
//        return instance;
//    }

//    private static Singleton instance;
//    private Singleton(){}
//    public static Singleton getInstance(){
//        if (instance == null){
//             instance = new Singleton();
//        }
//        return instance;
//    }


    /**通过volatile修饰的变量不会被线程本地缓存，读写会第一时间同步到主内存，从而保证多个线程间该对象的准确性
     * volatile 防止指令重排序 保证内存可见
     * volatile可能会屏蔽掉一些必要的代码优化，所以运行效率不是很高
     */
    private static volatile Singleton instance = null;
    private Singleton(){}
    public static Singleton getInstance(){
        if (instance == null){
            synchronized (Singleton.class){
                if (instance == null){
//                    jvm有可能先分配一些内存给实例，并赋值，但没有初始化 然后其他线程进来会导致出错
                    instance = new Singleton();
                }
            }

        }
        return instance;
    }

}






